昨天成功建立了第一個container image,今天就來接續著建立出來的教學文件實作吧。
首先先下載位於教學文件Our Application頁上的todo-list範例。
接下來就是要撰寫運行Docker的靈魂人物 ── Dockerfile
依照官方提供的寫法如下
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
- FROM 表示執行的環境,還可以設定ubuntu等。
- WORKDIR 為image設置的工作目錄。
- COPY
格式: COPY <host路徑> <目標路徑>
表示從host複製檔案至container的系統下。- RUN 會在當前image的頂端的new layer執行,再來才會創建image,通常用來安裝套件,如上則是代表要使用yarn下載package.json對映的套件。
- CMD CMD的主要目的是為執行中的container提供默認指令。在dockerfile中只會生效最後一個CMD指令。如上則是代表要使用node.js執行src/index.js。
如果只是要建置APP玩玩,基本上撰寫完dockerfile就完成大部分拉。
接下來便可以執行以下兩個命令建置container image並執行
docker build -t getting-started .
docker run -dp 3000:3000 getting-started
-t 代表為建立的image命名getting-started的tag,如果不使用就會自動產生隨機值。
在指令跑完之後就能打開http://localhost:3000 查看建立的APP拉。
接下來可能會想問說,如果修改後的程式該怎麼更新至image呢?
是直接執行建置跟運行的指令就可以了嗎? 馬上來試試看吧
執行之後卻發現印出了錯誤!是怎麼回事呢?
docker.exe: Error response from daemon: driver r failed programming external connectivity on endpoint gracious_johnson (db545d677ed4b1e336a876ae9c905833bbb4b201cfa09a70314d4e3c66d9396435): Bind for 0.0.0.0:3000 failed: port is aly ready allocated.
總之呢就是,因為要運行的位置已經有image了所以無法運行。
Docker不會幫你刪掉舊有的image (Docker: 自己去刪拉
因此我們馬上來學習如何停止並刪除現有的image。
要停止/刪除現有得image需要先執行以下命令,用來查看image的container-id。
docker ps --all
--all 代表會列出所有啟用及停用的image
沒意外的話會類似於下方顯示的結果,找到剛剛建置得getting-start的container-id
再來就是停止並移除image
docker stop <container-id>
docker rm <container-id>
移除完image之後再執行
docker run -dp 3000:3000 getting-started
修改過的程式就運行在contrainer上了。
明天接著學習如何將image使用的數據永久的保存,使用Container Volumes並搭配Bind Mounts。